根据阅读注释和跟踪父类Queue源码,我们得知,BlockingQueue的方法主要分三类:
2 并发编程的三大问题 原子性问题:不可中断的一系列动作,不会被线程调度机制打断,也不会被CPU响应中断打断。 另外,JMM定义了一套抽象指令,由JVM编译为具体的机器指令,用于屏蔽不同硬件的差异性,保证Java程序在不同平台下对内存访问是一致的。 也就是说Java内存模型对内存的划分对硬件内存没有任何影响,因为JMM只是一种抽象,是一组规则,并不实际存在,对硬件来说都会存储到主存、寄存器或者高速缓存中。 图片 本质上,这些规则是解决各种场景在并发时的可见性问题: 程序顺序规则:一个线程中的每个操作都应该happens-before该线程任何后续操作。即线程内每个操作的结果对该线程所有后续操作都可见。 每个Java对象都有一个监视器对象同生共死,获取锁失败的线程会进入监视器对象的阻塞队列等待被唤醒。
在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。那么它们产生的原因和在Java中解决的办法又是什么呢? 二、并发编程的三个概念存在的问题 1、 线程切换带来的原子性问题: Java中的一条语句,在翻译为机器码之后,可能对应的是多个指令。 内存模型 在前面谈到了一些关于内存模型以及并发编程中可能会出现的一些问题。 下面我们来看一下Java内存模型,研究一下 Java内存模型 为我们提供了哪些保证以及在java中提供了哪些方法和机制来让我们在进行多线程编程时能够保证程序执行的正确性。 也就是说,在java内存模型中,也会存在缓存一致性问题和指令重排序的问题。
Java内存模型 Java的世界也有属于它自己的内存模型,Java内存模型(Java Memory Model),简称JMM。 由于Java被定义成一种跨平台的语言,所以在内存的描述上面也要能是跨平台的,Java虚拟机试图定义一种统一的内存模型,能将各种底层硬件及操作系统的内存访问差异进行封装,使Java程序在不同硬件及操作系统上都能达到相同的并发效果 JMM可见性 在Java内存模型中,如果一个线程更改了共享变量的值,其他线程能马上知道这个更改,则我们说这个变量具有可见性。 JMM原子性 Java内存模型保证了read、load、assign、use、store、write等操作具有原子性,我们可以认为除了long和double类型外,对其他基本数据类型所对应的内存单元的访问读写都是原子的 总结 JMM可以说是Java的基础,也是Java多线程的基础,它的定义将直接影响JVM及Java多线程实现的机制。要想深入了解多线程并发中的相关问题现象,对Java内存模型的深入研究是必不可少的。
前言 上一篇我们介绍了在并发编程里面导致bug的三种问题,可见性问题,原子性问题,有序性问题。 针对这三个问题,Java语言提供了Java内存模型(JMM)来解决这三种问题,主要是针对有序性和可见性问题。其本质上就是按需禁用缓存和编译优化。接下来我们就详细的阐述下。 Java内存模型介绍 Java 内存模型是一个很复杂的规范,本质上可以理解为:Java内存模型规范了JVM如何提供按需禁用缓存和编译优化(本质上是指令重排序)的方法。 对象终结规则 对象终结规则:一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始 在Java中finalize()方法我们用的比较少。再次不详细展开说明。 在多线程环境下可以利用其不变性 总结 本文主要介绍了 Java内存模型是如何通过一系列的规则来对并发编程中的可见性问题,有序性问题进行控制的。本质上还是 按需禁用缓存和编译器优化。
简介 Java内存模型英文叫做(Java Memory Model),简称为JMM。Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性。 Java内存模型(JMM) Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性。其底层是根据不同系统的缓存读写协议分别进行处理的。 Java内存模型定义了线程和主内存之间的抽象关系,Java各线程之间的通信是有Java内存模型所控制的。 Thread.sleep(3000); System.out.println(a); } } 复制代码 image.png 这里有一万个线程去操作共享数据a,如果不存在并发问题的话 总结 本文介绍了Java的内存模型,这里需要强调的一点是,Java内存模型不同于Java内存结构,不要将二者概念混淆。
一、什么是JMM内存模型 Java内存模型即 Java Menory Model,简称JMM。JMM定义了Java虚拟机(JVM)在计算机内存(RAM)中的工作方法。 模型如下: 二、Java内存模型与并发编程的关系 如果想要深入了解Java并发编程,就要先理解好Java内存模型。 并发编程的模型分类 总共分成两类: 共享内存并发模型 消息传递并发模型 在并发编程中的关键问题 线程之间如何通信 线程之间如何同步 通信是指线程之间以何种机制来交换信息,在命令式编程中(编程主要分类:允许有副作用的命令式编程 Java里面的并发就是采用共享内存的并发模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员是完全透明的(即你是看不见就发生了并发过程)。 Java的并发模型采用的是共享内存模型 Java线程之前的通信总是隐式进行的,整个通信过程对程序员完全透明。
相关文章 Java并发编程(一)线程定义、状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 前言 此前我们讲到了线程、同步以及volatile关键字,对于Java的并发编程我们有必要了解下 Java的内存模型,因为Java线程之间的通信对于工程师来言是完全透明的,内存可见性问题很容易使工程师们觉得困惑,这篇文章我们来主要的讲下Java内存模型的相关概念。 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。 同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。 在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对工程师完全透明。 参考资料: 《Java并发编程的艺术》 深入理解Java内存模型(一)——基础
1、Java 内存模型 JMM 即 Java Memory Model ,它从Java层面定义了 主存、工作内存 抽象概念,底层对应着CPU 寄存器、缓存、硬件内存、CPU 指令优化等。 在CPU层面与主内存层面,通过缓存一致性协议,加锁后能够保证写的值同步到主内存,使其他线程能够获得最新的值 使用synchronized关键字也有相同的效果, 在Java内存模型中,synchronized
简介 Java内存模型英文叫做(Java Memory Model),简称为JMM。Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性。 Java内存模型(JMM) Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性。其底层是根据不同系统的缓存读写协议分别进行处理的。 Java内存模型定义了线程和主内存之间的抽象关系,Java各线程之间的通信是有Java内存模型所控制的。 } Thread.sleep(3000); System.out.println(a); } } 这里有一万个线程去操作共享数据a,如果不存在并发问题的话 总结 本文介绍了Java的内存模型,这里需要强调的一点是,Java内存模型不同于Java内存结构,不要将二者概念混淆。
本篇内容包括:进程与线程&并行与并发的基本概念,Java内存模型中的内存划分、内存交互、内存交互,以及JMM的相关概念,包括了 CPU 和缓存一致性、重排序、处理器重排序与内存屏障指令、JMM 的重排序屏障 ---- 二、Java 内存模型 JMM(Java Memory Model)即 Java 内存模型,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的并发效果 原始的 Java 内存模型存在一些不足,因此 Java 内存模型在 Java1.5 时被重新修订。这个版本的 Java 内存模型在 Java8 中仍然在使用。 其实这些就是Java内存模型封装了底层的实现后提供给程序员使用的一些关键字。 好了,这里简单的介绍完了 Java 并发编程中解决原子性、可见性以及有序性可以使用的关键字。
(信息共享、OOM内存溢出) VM stack(栈):Java方法运行的内存模型(OOM内存溢出)。如下: PC:Java线程的私有数据,这个数据就是执行下一条指令的地址。 JVM内存模型 Java Memory Model(JMM),是一种规范,是一种抽象的模型。 硬件内存架构与Java内存模型 硬件架构 CPU缓存的一致性问题:并发处理的不同步,如内存中的变量X=1,CPU1修改X=2,此时CPU2读取X的值,那么CPU2读取的X的值有可能为1(由于并发处理 Java线程与硬件处理器 Java内存模型与硬件内存架构的关系 由上可知,交叉访问,导致数据不一致性。 4. Java内存模型的必要性 Java内存模型的作用:规范内存数据和工作空间数据的交互 并发编程的三个重要特性 原子性:不可分割 ,如转账操作,扣钱和加钱,要么同时成功,要么同时失败。
前言 首先我们在了解java内存模型之前先看一下计算机内存模型,理解了计算机内存模型的话后面在看JMM就会简单的多,上篇文章我是直接写的。 在Java虚拟机中也有类似的指令重排序。 思考 这篇文章其实是讲述java内存模型的,为什么会和计算机硬件扯上关系呢? 注意到上面有说到多线程的情况下会造成缓存不一致的问题,提到多线程就离不开并发,想到并发的话就离不开三大问题,可见性,原子性,有序性的问题。 那么Java内存模型又是什么呢? java内存模型 Java内存模型的作用就是用来屏蔽掉不同操作系统中的内存差异性来保持并发的一致性。同时JMM也规范了JVM如何与计算机内存进行交互。 同时Java内存模型可以理解为java并发内存模型。
关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础的内容,注意,阅读本文需要一定的并发基础。 并发三问题 这节将介绍重排序、内存可见性以及原子性相关的知识,这些也是并发程序为什么难写的原因。 1. 原子性 在本文中,原子性不是重点,它将作为并发编程中需要考虑的一部分进行介绍。 Java 对于并发的规范约束 并发问题使得我们的代码有可能会产生各种各样的执行结果,显然这是我们不能接受的,所以 Java 编程语言规范需要规定一些基本规则,JVM 实现者会在这些规则的约束下来实现 JVM 还有,并不是只有 Java 语言才有 volatile 关键字,所以后面的描述一定要建立在 Java 跨平台以后抽象出了内存模型的这个大环境下。 还记得 synchronized 的语义吗?
并发编程之Java内存模型 5.1 Java内存模型 5.2 可见性 5.3 有序性 volatile原理 double-checked locking 单例模式为例 4.double-checked locking 解决 5.1 Java内存模型 JMM即Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。
前言 首先我们在了解java内存模型之前先看一下计算机内存模型,理解了计算机内存模型的话后面在看JMM就会简单的多,上篇文章我是直接写的。 在Java虚拟机中也有类似的指令重排序。 思考 这篇文章其实是讲述java内存模型的,为什么会和计算机硬件扯上关系呢? 注意到上面有说到多线程的情况下会造成缓存不一致的问题,提到多线程就离不开并发,想到并发的话就离不开三大问题,可见性,原子性,有序性的问题。 那么Java内存模型又是什么呢? java内存模型 Java内存模型的作用就是用来屏蔽掉不同操作系统中的内存差异性来保持并发的一致性。同时JMM也规范了JVM如何与计算机内存进行交互。 同时Java内存模型可以理解为java并发内存模型。
本文转载自公众号: Java技术驿站 经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结。 2、博文列表(可点击阅读) 【死磕Java并发】—–Java内存模型之happens-before 【死磕Java并发】—–Java内存模型之重排序 【死磕Java并发】—–Java内存模型之分析volatile 【死磕Java并发】—–Java内存模型之从JMM角度分析DCL 3、Java内存模型推荐资料 程晓明:深入Java内存模型 周志明:深入理解Java虚拟机-第五部分 高效并发 Java 并发编程 :volatile的使用及其原理 Java并发编程:volatile关键字解析 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型 聊聊高并发( 三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before
经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结。 总结 JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。 博文列表 【死磕Java并发】—–Java内存模型之happens-before 【死磕Java并发】—–Java内存模型之重排序 【死磕Java并发】—–Java内存模型之分析volatile 【死磕 Java并发】—–Java内存模型之从JMM角度分析DCL Java内存模型推荐资料 程晓明:深入Java内存模型 周志明:深入理解Java虚拟机-第五部分 高效并发 Java 并发编程:volatile 的使用及其原理 Java并发编程:volatile关键字解析 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型 聊聊高并发(三十四)Java内存模型那些事 (二)理解CPU高速缓存的工作原理 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则 happens-before
其实JVM对异常做了一种特殊的处理,为了保证as-if-serial语义,Java异常处理机制对重排序做了一种特殊的处理:JIT在重排序时会在catch语句中插入错误代偿代码(a = 3),这样做虽然会导致 参考资料 周志明 :《深入理解Java虚拟机》 方腾飞:《Java并发编程的艺术》
其实JVM对异常做了一种特殊的处理,为了保证as-if-serial语义,Java异常处理机制对重排序做了一种特殊的处理:JIT在重排序时会在catch语句中插入错误代偿代码(a = 3),这样做虽然会导致 参考资料 周志明 :《深入理解Java虚拟机》 方腾飞:《Java并发编程的艺术》 END